/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package evabot.facade;

// bibliotecas utilizadas
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import evabot.bot.EvaBotController;
import evabot.mail.SendMail;
import evabot.xml.AIMLController;
import bitoflife.chatterbean.AliceBot;
import bitoflife.chatterbean.parser.AliceBotParserConfigurationException;
import bitoflife.chatterbean.parser.AliceBotParserException;

/**
 *
 * Facade do ChatterBot.
 *
 * @author Alexandre Sales, Danielle Chaves, Maria Isabel Farias
 *
 */
public class BotFacade {

	EvaBotController aliceController;
	AIMLController domController;
	SendMail mail;

	/**
	 * Construtor da classe de manipulacao do bot.
	 */
	public BotFacade() {
		domController = AIMLController.getInstance();
		this.aliceController = null;
	}

	/**
	 * Cria uma instancia de um Bot.
	 *
	 * @param contextFile
	 * 		Localizacao do context.xml.
	 * @param splitterFile
	 * 		Localizacao do splitters.xml.
	 * @param substitutions
	 * 		Localizacao do substitutions.xml.
	 * @param parentDirectory
	 * 		Localizacao do diretorio raiz da base de conhecimento.
	 * @param aimlFiles
	 * 		Localizacao dos arquivos aiml.
	 * @throws IOException
	 * 		Erro de entrada/saida.
	 * @throws AliceBotParserException
	 * 		Caso haja algum diretorio de configuracao invalido.
	 * @throws AliceBotParserConfigurationException
	 * 		Caso haja algum arquivo de configuracao errado.
	 * @throws FileNotFoundException
	 * 		Caso o arquivo nao exista.
	 */
	public void createBot(String contextFile,String splitterFile,String substitutions,String parentDirectory,String aimlFiles,String aimlPersonal) throws FileNotFoundException, AliceBotParserConfigurationException, AliceBotParserException, IOException {
		aliceController = EvaBotController.getInstance(contextFile, splitterFile, substitutions, parentDirectory, aimlFiles, aimlPersonal);
	}

	/**
	 * Responsavel pela resposta do Bot para uma determinada pergunta.
	 *
	 * @param question
	 * 		A pergunta a ser feita.
	 *
	 * @return A resposta do Bot de acordo com a base de conhecimento.
	 *
	 * @throws IOException
	 * 			Erro de entrada/saida.
	 * @throws SAXException
	 * 			Caso haja algum erro ou aviso SAX.
	 * @throws ParserConfigurationException
	 * 			Caso haja algum erro na configuracao do Parser do Chatterbean.
	 */
	public String botRespond(String question) throws ParserConfigurationException, SAXException, IOException {
		return aliceController.respond(question);
	}

	/**
	 * Metodo que retorna o bot.
	 *
	 * @return O AliceBot.
	 */
	public AliceBot getBot() {
		return aliceController.getBot();
	}


	/**
	 * Determina se o dialogo deve ser gravado.
	 *
	 * @param isLogging
	 * 		Retorna true, caso se deseje que o dialogo seja gravado;
	 * 		Retorna false, caso contrario.
	 */
	public void setLog(boolean isLogging) {
		aliceController.setLog(isLogging);
	}

	/**
	 * Retorna se o dialogo estao sendo gravando ou nao.
	 *
	 * @return  Retorna true, caso o dialogo esteja sendo gravado;
	 * 			Retorna false, caso contrario.
	 */
	public boolean isLogging() {
		return aliceController.isLogging();
	}

	/**
	 * Cria um esqueleto de um arquivo AIML, com apenas o cabecalho
	 * e as tags <aiml></aiml>.
	 *
	 * @param fileName
	 * 		O nome do arquivo a ser criado.
	 *
	 * @return o arquivo AIML.
	 */
	public boolean createBlankAIMLFile() {
		return domController.createBlanckAIMLFile();
	}

	/**
	 * Seta a resposta padrao dada pelo Bot, quando nao houver resultado para
	 * a pergunta solicitada.
	 *
	 * @param defaultResponse
	 * 			A pergunta padrao.
	 */
	public void setDeafultResponse(String defaultResponse) {
		aliceController.setDefaultResponse(defaultResponse);
	}

	/**
	 * Seta o nome do arquivo AIML a ser criado para o usuario corrente.
	 *
	 * @param fileName
	 * 			O nome do arquivo.
	 */
	public void setFileName(String fileName) {
		domController.setFileName(fileName);
	}

	/**
	 * Cria e-mail ao final do dialogo, informando a existencia de novas
	 * informacoes na Base de Conhecimento do Bot.
	 *
	 * @param from
	 * 			E-mail do remetente.
	 * @param remittingName
	 * 			Nome do remetente.
	 * @param to
	 * 			E-mail do destinatario.
	 * @param receiverName
	 * 			E-mail do destinatario.
	 * @param subject
	 * 			Assunto do e-mail.
	 * @param text
	 * 			Conteudo do e-mail.
	 * @param mailSMTPServer
	 * 			Servidor desejado.
	 * @param mailSMTPPort
	 * 			Porta utilizada.
	 */
	public void createMail(String from, String remittingName, String to, String receiverName,
			String subject, String text, String mailSMTPServer, String mailSMTPPort) {
		mail = new SendMail(from, remittingName, to, receiverName,
				subject, text, mailSMTPServer, mailSMTPPort);
	}

	public void addCC(String ccMail, String ccName) {
		mail.addCc(ccMail, ccName);
	}

	/**
	 * Responsavel pela autenticacao do usuario remetente do e-mail.
	 *
	 * @param userName
	 * 			Nome do usuario.
	 * @param password
	 * 			Senha do usuario.
	 */
	public void setAuthentication(String userName, String password) {
		mail.setAuthentication(userName, password);
	}

	/**
	 * Envia e-mail para os botmasters informando que ha novas informacoes na
	 * Base de Conhecimento do Bot.
	 */
	public void sendMail() {
		mail.sendMail();
	}

	/**
	 *  Conexao, por default do CommonMail, nao e SSL. Como alguns servidores
	 *  sao, serao necessario setar como verdadeiro
	 */
	public void setSLL() {
		mail.isSLL();
	}

}